/* 高深智能发卡模块接口 */

var layer = null;
var cardObj = null;
var defaultSection = 14;
var cardState = null;
var securityCode = null;

function cardModuleInit(layerObj, card) {
    layer = layerObj;
    cardObj = card;
}

function callbackDlgAddPerms(commCode, devDisp, devNumber, devAccount) {

    /* 将设备号转成16进制 */
    var dev16 = appendZero(parseInt(devNumber).toString(16));
    $("#perms").append(
        '<div class="permsItem">' +
        '<button type="button" class="permsRemove layui-btn layui-btn-small layui-btn-danger" style="margin-right:20px">删除</button>' +
        '<input type="hidden" name="permsStr" value="'+$("#sp").val() + commCode + ':' + dev16 + ':' + devDisp + ':' + devAccount + '"/>' +
        devDisp +
        '</div>'
    );

    $("#perms p").remove();

    $(".permsRemove").click(function () {
        $(this).parent().remove();
    });
}

/* 检测当前读到的卡号在云端状态是否正常 */
function checkCardState(target) {
    if(target != cardState){
        return 0;
    }
    if(cardState == "blacked"){
        layer.alert("此卡之前已被挂失,请去卡列表页面恢复!");
        return -1;
    }else if(cardState == "supper"){
        layer.alert("此卡为超级卡,请去超级卡页面恢复!");
        return -1;
    }else if(cardState == "normal"){
        layer.alert("此卡为普通卡,请去普通卡页面恢复!");
        return -1;
    }

    return -1;
}


/* 读卡号，读到后去服务端搜索改卡信息 */
function readNo() {
    cardState = null;

    //判断发卡器是否已经连接到电脑,函数原型: int Connected();
    var isConected = cardObj.Connected();
    if (isConected != 1) {
        layer.alert("发卡器未连接");
        return;
    }
    var scardno = cardObj.ReadCardNo();
    $("#nCardNo").val(scardno);

    if (scardno == null || scardno == '') {
        layer.msg("未读到卡号");
    } else {
        $("#selectOwner").empty();
        $("#perms").empty();

        var params = {
            cardNo: scardno
        };
        $.post(
            "/card/findCard.x",        //服务器要接受的url
            params,     //传递的参数
            function cbf(data) { //服务器返回后执行的函数 参数 data保存的就是服务器发送到客户端的数据
                data = data.data;
                //console.log(data);
                if ((data.cardInfo == null) && $("#perms div").length == 0) {
                    $("#perms").append('<p>未查找到该卡的权限记录</p>');
                    return;
                }
                else if (data.cardInfo.cardType == "s") {
                    layer.alert("检测到此卡已发布为超级卡,继续发布会清除掉超级卡数据！", {icon: 0});
                    cardState = "supper";
                    return;
                }
                else {
                    $("#selectOwner").text(data.ownerStr);
                    $("#ownerCode").val(data.cardInfo.ownerCode);
                    $("#ownerName").val(data.cardInfo.ownerName);
                    $("#commCode").val(data.cardInfo.commCode);
                    $("#cardType").val(data.cardInfo.cardType);
                    $("#roomName").val(data.cardInfo.roomName);
                    $("select[name='nState']").val(data.cardInfo.state);

                    $("#perms").empty();
                    for (var i = 0; i < data.cardPerms.length; i++) {
                        callbackDlgAddPerms(data.cardInfo.commCode, data.cardPerms[i].devStr,
                            data.cardPerms[i].devNo, data.cardPerms[i].devBuildingNo);
                    }
                    /* 假如卡已经被挂失，如果不恢复，梯口机的权限无法被恢复，不能直接发卡 */
                    if (data.cardInfo.state == "02") {
                        cardState = "blacked";
                        checkCardState(cardState);
                    }
                }

            },
            'json' //数据传递的类型  json
        );
    }
}

function readSupperNo() {
    //判断发卡器是否已经连接到电脑,函数原型: int Connected();
    var isConected = cardObj.Connected();
    if (isConected != 1) {
        layer.alert("发卡器未连接");
        return;
    }
    var scardno = cardObj.ReadCardNo();
    $("#sCardNo").val(scardno);

    if (scardno == null || scardno == '') {
        layer.msg("未读到卡号");
    } else {
        var params = {
            cardNo: scardno
        };
        $.post(
            "/card/findCard.x",        //服务器要接受的url
            params,     //传递的参数
            function cbf(data) { //服务器返回后执行的函数 参数 data保存的就是服务器发送到客户端的数据
                if ((data == null || data == '') && $("#perms div").length == 0) {
                    return;
                } else if (data.cardInfo.cardType == "n") {
                    layer.alert("检测到此卡已发布为普通卡,继续发布超级卡会清除掉以前的普通卡数据！", {icon: 0});
                    return;
                }
                else {

                    if ($("select[name='sCommCode']") != undefined) {
                        $("select[name='sCommCode']").val(data.cardInfo.commCode);
                    } else {
                        $("#commTd").empty();
                        $("#commTd").text(data.commName);
                    }
                    $("#cardType").val(data.cardInfo.cardType);
                    $("#commCode").val(data.cardInfo.commCode);
                    $("select[name='sState']").val(data.cardInfo.state);

                }

            },
            'json' //数据传递的类型  json
        );
    }
}

/*
 设置秘钥函数原型: int SetKey(char * skey,int flag);   给每个小区设置不同的秘钥，才能使不同小区卡片不能通用
 参数skey:总共12个16进制字符，也就是只能是数字和A-F
 参数flag:  0：表示不允许发行未经初始化的卡片  1：表示允许发行未经初始化的卡片
 */
function setSecurtyKey(sKey) {
    if(securityCode == sKey){
        console.log("return skey directly "+sKey);
        return true;
    }else{
        securityCode = sKey;
    }

    var iRes = cardObj.SetKey(sKey, 1);
    if (iRes == 0) {
        return true;
    }
    else {
        layer.alert("秘钥设置失败", {icon: 5});
        return false;
    }
}

/*
 参数sector:表示要门禁卡的扇区，
 doorAuth:门禁权限,  由16进制字符组成，每个门禁占2个字符，总共32个字符表示8个门禁,如:01080A25000000000000000000000000  表示卡片有1号,8号,10号，37号门禁机的权限
 EndDate:卡片的有效日期,   这个日期不是真正的日期，而是用有效日期到1970年1月1日的天数来表达的，如果EndDate=65535,表示是永久日期
 CardType:卡片类型  ,6:普通权限，开启有限的门禁  10:超级用户卡 ，可以开启本小区内所有门禁 ,当CardType=10时，doorAuth参数无效
 */
function setPermissions(sector, doorAuth, EndDate, CardType) {

    //console.log("sector " + sector + " doorAuth " + doorAuth + " EndDate " + EndDate + " cardType " + CardType);
    var iRes = cardObj.WriteDoorCard(sector, doorAuth, EndDate, CardType);
    if (iRes == 0) {
        return true;
    }
    else {
        layer.alert("发卡失败  error " + iRes);
        return false;
    }
}

/*
 写卡权限
 password:小区密码
 permStr:卡权限数据
 */
function writeCard(password, permStr, type,cardno) {
    var isConected = cardObj.Connected();
    if (isConected != 1) {
        layer.alert("发卡器未连接");
        return;
    }

    var realCardNo = cardObj.ReadCardNo();

    if(cardno != realCardNo){
        console.log(cardno +"!="+realCardNo)
        layer.alert("卡号不对!请重新读取该卡");
        return;
    }

    /* 先写秘钥 */
    if (!setSecurtyKey(password))
        return false;
    /* 再写权限 */
    return setPermissions(defaultSection, permStr, 65535, type);
}

/*
 读门禁卡函数原型: int ReadDoorCard(int sector);
 参数sector:表示要读取门禁卡的扇区，
 执行ReadDoorCard后，我们可以从属性DoorAuth，EndDate，CardType获取读取的数据
 */
function ReadCardFun(password) {
    /* 先写秘钥 */
    if (!setSecurtyKey(password)) {
        return false;
    }
    var iRes = cardObj.ReadDoorCard(defaultSection);
    if (iRes == 0) {
        if (cardObj.CardType == 10) {
            //alert("此卡为超级卡");
            //这里还可以解析USBCardRW.EndDate获取有效期
        }
        else if (cardObj.CardType == 6) {
            //alert("此卡为普通卡");
            //这里还可以解析USBCardRW.DoorAuth获取门禁权限
            //这里还可以解析USBCardRW.EndDate获取有效期
        }
        return true;
    }
    else {
        return false;
    }
};

/* 恢复扇区函数原型: int ResumeCard(int sector);  参数Sector:表示要恢复的扇区
*  return: 0表示成功*/
function resumeCard(password) {
    if (!setSecurtyKey(password)) {
        return false;
    }
    var iRes=cardObj.ResumeCard(defaultSection);
    return iRes;

}
    
    